# BSD3.0
# cili@163.com

import tkinter as tk
from tkinter import messagebox
import qrcode
import io
import tempfile
import os

class QRCodeGeneratorApp:
    def __init__(self, root):
        self.root = root
        self.root.title("二维码生成器")
        self.root.resizable(False, False)  # 禁止调整窗口大小
        self.init_gui()
        self.center_window()  # 调用居中窗口的方法

    def init_gui(self):
        # 创建一个主框架，包含左侧和右侧两部分
        self.main_frame = tk.Frame(self.root)
        self.main_frame.pack(fill=tk.BOTH, expand=True)

        # 创建左侧框架，包含输入框和按钮
        self.left_frame = tk.Frame(self.main_frame)
        self.left_frame.pack(side=tk.LEFT, padx=10, pady=10, fill=tk.Y)

        # 创建输入框，长度为30，默认显示一句话
        self.entry = tk.Entry(self.left_frame, width=25)
        self.entry.insert(0, "绿水青山就是金山银山。")  # 插入默认文本
        # 设置输入框的最大长度为25
        self.entry.config(validate="key", validatecommand=(self.root.register(self.validate_input), "%P"))
        self.entry.pack(side=tk.TOP, padx=10, pady=10)

        # 创建按钮，点击后调用click方法
        self.button = tk.Button(self.left_frame, text="生成二维码", command=self.click)
        self.button.pack(side=tk.TOP, padx=10, pady=10)

        # 创建右侧框架，用于显示二维码
        self.right_frame = tk.Frame(self.main_frame)
        self.right_frame.pack(side=tk.RIGHT, padx=10, pady=10)

        # 创建画布用于显示二维码，大小设置为200x200
        self.canvas = tk.Canvas(self.right_frame, width=200, height=200)
        self.canvas.pack()

    def validate_input(self, P):
        # 检查输入的字符数是否超过25个
        if len(P) <= 25:
            return True  # 输入有效
        else:
            messagebox.showwarning("警告", "输入不能超过25个字符。")
            return False  # 输入无效


    def click(self):
        text = self.entry.get().strip()  # 获取输入框的内容并去除首尾空格
        if text:  # 检查输入是否为空
            # 生成二维码
            qr = qrcode.QRCode(
                version=1,
                error_correction=qrcode.constants.ERROR_CORRECT_L,
                box_size=10,
                border=4,
            )
            qr.add_data(text)
            qr.make(fit=True)

            # 将二维码转换为PNG格式的字节流
            img = qr.make_image(fill_color="black", back_color="white")
            img_bytes = io.BytesIO()
            img.save(img_bytes)
            img_bytes.seek(0)

            # 将字节流写入临时文件
            temp_file = tempfile.NamedTemporaryFile(suffix='.png', delete=False)
            temp_file.write(img_bytes.read())
            temp_file.close()

            # 使用Tkinter的PhotoImage从临时文件加载图片
            self.qr_image = tk.PhotoImage(file=temp_file.name)
            self.qr_image = self.qr_image.subsample(2, 2)
            self.canvas.create_image(100, 100, image=self.qr_image, anchor=tk.CENTER)

            # 清理临时文件
            self.root.after(5000, lambda: os.remove(temp_file.name))
        else:
            # 如果输入为空，弹出消息框提示
            messagebox.showwarning("警告", "输入不能为空，请输入文本后再生成二维码。")

    def center_window(self):
        # 获取屏幕宽度和高度
        screen_width = self.root.winfo_screenwidth()
        screen_height = self.root.winfo_screenheight()
        # 计算窗口的宽度和高度
        window_width = 460  # 设置窗口宽度
        window_height = 220  # 设置窗口高度
        # 计算窗口居中的位置
        x_cordinate = int((screen_width/2) - (window_width/2))
        y_cordinate = int((screen_height/2) - (window_height/2))
        # 设置窗口的位置
        self.root.geometry(f"{window_width}x{window_height}+{x_cordinate}+{y_cordinate}")

# 创建主窗口
root = tk.Tk()
app = QRCodeGeneratorApp(root)
root.mainloop()
